package business;

import java.util.Date;

import org.hibernate.Transaction;

import org.hibernate.Session;

import utils.HibernateUtil;

import entities.Lid;
import entities.Medewerker;
import entities.Persoon;

public class PersoonWijziger implements IEntityWijziger<Persoon>
{
	private Persoon persoon;
	
	private String naam;
	private String voornaam;
	private String tussenvoegsel;
	private Date geboortedatum;
	
	private String postcode;
	private String telefoonnummer;
	private String email;
	
	private String rekeningnummer;
	private String gebruikersnaam;
	private String inlogcode;
	
	// Constructor
	
	public PersoonWijziger(Persoon persoon)
	{
		this.persoon = persoon;
		naam = persoon.getNaam();
		voornaam = persoon.getVoornaam();
		tussenvoegsel = persoon.getTussenvoegsel();
		geboortedatum = persoon.getGeboortedatum();
		postcode = persoon.getPostcode();
		telefoonnummer = persoon.getTelefoonnummer();
		email = persoon.getEmail();
		rekeningnummer = persoon.getRekeningnummer();
		gebruikersnaam = persoon.getGebruikersnaam();
		inlogcode = persoon.getInlogcode();
	}
	
	// Getters en Setters
	
	public String getNaam()
	{
		return naam;
	}
	public void setNaam(String naam)
	{
		this.naam = naam;
	}
	public String getVoornaam()
	{
		return voornaam;
	}
	public void setVoornaam(String voornaam)
	{
		this.voornaam = voornaam;
	}
	public String getTussenvoegsel()
	{
		return tussenvoegsel;
	}
	public void setTussenvoegsel(String tussenvoegsel)
	{
		this.tussenvoegsel = tussenvoegsel;
	}
	public Date getGeboortedatum()
	{
		return geboortedatum;
	}
	public void setGeboortedatum(Date geboortedatum)
	{
		this.geboortedatum = geboortedatum;
	}
	public String getPostcode()
	{
		return postcode;
	}
	public void setPostcode(String postcode)
	{
		this.postcode = postcode;
	}
	public String getTelefoonnummer()
	{
		return telefoonnummer;
	}
	public void setTelefoonnummer(String telefoonnummer)
	{
		this.telefoonnummer = telefoonnummer;
	}
	public String getEmail()
	{
		return email;
	}
	public void setEmail(String email)
	{
		this.email = email;
	}
	public String getRekeningnummer()
	{
		return rekeningnummer;
	}
	public void setRekeningnummer(String rekeningnummer)
	{
		this.rekeningnummer = rekeningnummer;
	}
	public String getGebruikersnaam()
	{
		return gebruikersnaam;
	}
	public void setGebruikersnaam(String gebruikersnaam)
	{
		this.gebruikersnaam = gebruikersnaam;
	}
	public String getInlogcode()
	{
		return inlogcode;
	}
	public void setInlogcode(String inlogcode)
	{
		this.inlogcode = inlogcode;
	}
	
	// Methoden
	
	@Override
	public void update()
	{
		Session session = null;
		Transaction tx = null;
		
		try
		{
			session = HibernateUtil.getSessionFactory().openSession();
			tx = session.beginTransaction();
			
			persoon = (Persoon) session.merge(persoon); // make sure the entity is unique.
			
			wijzigPersoon();
			
			try
			{
				session.update((Lid)persoon);
			}
			catch(ClassCastException e)
			{
				try
				{
					session.update((Medewerker)persoon);
				}
				catch(ClassCastException f)
				{
					
				}
			}
			
			tx.commit();
		}
		catch(RuntimeException e)
		{
			if(tx != null)
			{
				tx.rollback();
			}
		}
		finally
		{
			if(session != null)
			{
				session.close();
			}
		}
	}

	private void wijzigPersoon()
	{
		persoon.setNaam(naam);
		persoon.setVoornaam(voornaam);
		persoon.setTussenvoegsel(tussenvoegsel);
		persoon.setGeboortedatum(geboortedatum);
		persoon.setPostcode(postcode);
		persoon.setTelefoonnummer(telefoonnummer);
		persoon.setEmail(email);
		persoon.setRekeningnummer(rekeningnummer);
		persoon.setGebruikersnaam(gebruikersnaam);
		persoon.setInlogcode(inlogcode);
	}
}
